package cn.leonis.leetcode;

import java.util.HashSet;
import java.util.Set;

/**
 * @author Tobi
 * @date 2021-06-09 10:04
 * 找出不重复的数字
 */
public class SingleNumberSolution {

    public static void main(String[] args) {
        int[] nums = {2, 2, 1};
        SingleNumberSolution solution = new SingleNumberSolution();
        System.out.println(solution.singleNumber(nums));
        System.out.println(solution.singleNumber2(nums));
    }

    /**
     * 解法一：空或者只有一个值的情况，使用异或操作，异或操作具有交换性
     * 异或运算 满足交换律 a^b^a = a^a^b = b
     * @param nums
     * @return
     */
    public int singleNumber(int[] nums) {
        int result = 0;

        for (int i = 0; i < nums.length; i++) {
            result ^= nums[i];
        }
        return result;
    }

    /**
     * 利用集合的属性，如果存在集合里面，就删除集合里面的值，最后只会剩下一个值
     * @param nums
     * @return
     */
    public int singleNumber2(int[] nums) {

        Set<Integer> integers = new HashSet<>();

        for (int i = 0; i < nums.length; i++) {
            if (!integers.add(nums[i])) {
                integers.remove(nums[i]);
            }
        }

        return (int) integers.toArray()[0];
    }
}
